package edu.uoc.vmerinom.tfc.action;

import java.io.Serializable;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.log.Log;
import org.jboss.seam.security.Credentials;
import org.jboss.seam.security.Identity;

import edu.uoc.vmerinom.tfc.domain.Usuario;
import edu.uoc.vmerinom.tfc.service.UsuariosService;
import edu.uoc.vmerinom.tfc.support.Message;
import edu.uoc.vmerinom.tfc.support.Utils;

/**
 * Manejador con las acciones relacionadas con la autenticación de usuario en la
 * aplicación. Mantiene las credenciales y un usuario en el contexto de
 * conversación que permitirá acceder en todo momento al usuario autenticado.
 * 
 * @author Víctor Manuel Merino Martínez
 * 
 */
@Name("autenticacionAction")
@Scope(ScopeType.CONVERSATION)
public class AutenticacionAction implements Serializable {
	/**
	 * Default Serial Version ID.
	 */
	private static final long serialVersionUID = 1L;
	/**
	 * Código de usuario.
	 */
	String user;
	/**
	 * Contraseña del usuario.
	 */
	String pass;

	/**
	 * Usuario.
	 */
	@Out(required = false, scope = ScopeType.CONVERSATION)
	Usuario usuario;

	/**
	 * Servicio de usuarios.
	 */
	@In(create = true)
	UsuariosService usuariosService;

	/**
	 * Credenciales de acceso.
	 */
	@In
	Credentials credentials;

	/**
	 * Identidad de acceso.
	 */
	@In
	Identity identity;

	/**
	 * Log para trazar errores.
	 */
	@Logger
	Log log;

	/**
	 * Autenticación de usuario.
	 */
	public boolean login() {
		boolean logged;
		usuario = usuariosService.obtenerUsuario(credentials.getUsername(), Utils.encrypt(credentials.getPassword(), Utils.SHA1));
		if (usuario != null && usuario.getId() != null) {
			identity.addRole(usuario.getPerfil().getNombre());
			logged = true;
		} else {
			Message.error("login.invalid");
			if (log.isInfoEnabled()) {
				log.info("No se ha encontrado el usuario " + user);
			}
			logged = false;
		}
		return logged;
	}

	public String getUser() {
		return user;
	}

	public void setUser(String user) {
		this.user = user;
	}

	public String getPass() {
		return pass;
	}

	public void setPass(String pass) {
		this.pass = pass;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}
}
